﻿#include "Mainwindow.h"
#include <QFormLayout>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFile>
#include <QFileDialog>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>



Mainwindow::Mainwindow(QWidget* parent)
	:QWidget(parent)
{
	this->initUi();

	//设置接受拖拽：
	this->setAcceptDrops(true);


}

void Mainwindow::initUi()
{
	//窗口的布局都在这里：
	layout();
	


	//按钮的信号与槽函数：
	QPushButton_connect();

	//两个复选框初始化：
		//1.2	设置编译套件：		当前Qt版本改变时，重新设置编译套件：通过信号槽来获取改变复选框信息：
	connect(m_qtVersionCbx, &QComboBox::currentTextChanged, this, [=]()
		{
			//改变编译套件复选框前	先清空：
			m_qtComplieCbx->clear();

			//根据	选择qt版本的	复选框的内容来		设置Qt的版本：
			m_qtEneFind.setQtVersion(m_qtVersionCbx->currentData().toString());
			//2.设置编译套件：
			m_qtComplieCbx->addItems(m_qtEneFind.qtCompilerList());
		});
		
		//1.3当编译套件改变时：设置		QtEnvFind		中的编译套件数据：
	connect(m_qtComplieCbx, &QComboBox::currentTextChanged, &m_qtEneFind, &QtEnvFind::setQtBuildSuite);


	//多选框内容：
		//1.1设置版本信息：
	auto list = m_qtEneFind.qtVersionList();
	for (auto v : list)
	{
		m_qtVersionCbx->addItem("Qt " + v, v);
	}
		//如果是先连接再添加的话，就不用设置默认值了，但是这样看着更舒服些；	还是先连接吧， 后面的不好搞；...
			
}

//窗口的布局都在这里：
void Mainwindow::layout()
{
	this->setWindowTitle("Qt快速部署工具");



	//设置窗口大小：
	setFixedSize(480, 320);

	m_qtVersionCbx = new QComboBox;
	m_qtComplieCbx = new QComboBox;
	m_exeFileBtn = new QPushButton("Qt 快速部署工具.exe");
	m_generateBtn = new QPushButton("生成");
	m_testExeBtn = new QPushButton("测试");
	m_aboutBtn = new QPushButton("关于");


	//给		拖拽/选择文件按钮  设置大小策略为扩张；尽量的大：
	m_exeFileBtn->setSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding);
	//给		拖拽/选择文件按钮  设置对象名：
	m_exeFileBtn->setObjectName("exeFileBtn");


	//布局：
	auto flayout = new QFormLayout;
	flayout->addRow("选择 Qt 的版本", m_qtVersionCbx);
	flayout->addRow("选择 编译 套件", m_qtComplieCbx);

	auto hlayout = new QHBoxLayout;
	hlayout->addWidget(m_testExeBtn);
	hlayout->addWidget(m_aboutBtn);

	auto vlayout = new QVBoxLayout(this);
	vlayout->addLayout(flayout);
	vlayout->addWidget(m_exeFileBtn);
	vlayout->addWidget(m_generateBtn);
	vlayout->addLayout(hlayout);

	vlayout->setContentsMargins(5, 5, 5, 5);
	vlayout->setSpacing(15);

#if 0
	//加载qss文件：
	QFile file(":/assets/qss/style.css");
	if (file.open(QIODevice::ReadOnly))
	{
		this->setStyleSheet(file.readAll());
	}
	else
	{
		qInfo() << "fuck" << file.errorString();
	}
#endif
}

//按钮的信号与槽函数：
void Mainwindow::QPushButton_connect()
{
	//信号槽：	
		//1.按下弹起		m_exeFileBtn按钮		来启动文件系统响应：
	connect(m_exeFileBtn, &QPushButton::pressed, this, &Mainwindow::onExeFileOpen);

	//2.生成按钮的信号槽：
	connect(m_generateBtn, &QPushButton::pressed, &m_qtEneFind, &QtEnvFind::Generate);

	//3.1测试按钮的信号槽：
	connect(m_testExeBtn, &QPushButton::released, &m_qtEneFind, &QtEnvFind::TestApp);

	//3.2判断是否测试成功：
	connect(&m_qtEneFind, &QtEnvFind::TestAppFinished, this, [=](bool f)
		{
			qInfo() << "测试是否成功：（true：成功；false：失败）>" << f;
			if (!f)
			{
				m_exeFileBtn->setText("测试失败，该exe是非法文件，请重新选择 或 检查文件是否正确");
			}
});

	//4.关于按钮的信号槽：
	connect(m_aboutBtn, &QPushButton::released, &m_qtEneFind, &QtEnvFind::AboutApp);

}

//拖拽进入事件函数：
void Mainwindow::dragEnterEvent(QDragEnterEvent* ev)
{
	ev->accept();
}

//拖拽松开事件函数：
void Mainwindow::dropEvent(QDropEvent* ev)
{
	//拖拽进来的内容：
	auto mdata = ev->mimeData();
	//通过url来实现：
	if (mdata->hasUrls())
	{
		for (auto v : mdata->urls())
		{
			qInfo() << v;
			//获取文件：
			auto exeFile = v.url(QUrl::PreferLocalFile/*本地文件*/);
			//只要一个exe文件：
			if (exeFile.indexOf(".exe") != -1)
			{
				//将获取到的exe文件名输出到m_exeFileBtn按钮上：
				m_exeFileBtn->setText(QFileInfo(exeFile).fileName());

				//将exe文件	传给QtEnvFind 的	exe文件数据：
				m_qtEneFind.setExeFile(exeFile);

				break;

			}

		}
	}

}

void Mainwindow::onExeFileOpen()
{
	auto filename = QFileDialog::getOpenFileName(this, "选择Qt的exe文件", "./", "exe(*.exe);; all(*.*)");
	if (!filename.isEmpty())
	{
		qInfo() << filename;

		//把exe的文件名传给QtEnvFind：
		m_qtEneFind.setExeFile(filename);


		//将获取到的exe文件名输出到m_exeFileBtn按钮上：
		m_exeFileBtn->setText(QFileInfo(filename).fileName());
	}
}
